﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using MemoryDuosControl;

namespace MemoryDuosInterfaz
{
    public partial class PartidaMultijugador : Form
    {
        private Button[,] arrayBotones;
        private List<Coordenadas> destapadas;
        public TableroMultijugador tablero;

        private bool CerradoPorCodigo { get; set; }

        public TimeSpan TiempoActual { get; set; }

        private TimeSpan TiempoInactivo;

        private Publicidad Publi { get; set; }

        private bool usado { get; set; }

        public PartidaMultijugador()
        {
            InitializeComponent();
        }

        public PartidaMultijugador(TableroMultijugador tablero)
            : this()
        {
            this.tablero = tablero;
            arrayBotones = new Button[tablero.Alto, tablero.Ancho];
            crearArrayBotones();
            destapadas = new List<Coordenadas>();
            tablero.ArrayBotones = arrayBotones;
            TiempoActual = new TimeSpan();
            Publi = new Publicidad(banner);
            TiempoInactivo = new TimeSpan();
            CerradoPorCodigo = false;
            usado = false;
        }

        public PartidaMultijugador(TableroMultijugador tablero, bool iniciar)
            : this(tablero)
        {
            if (iniciar)
            {
                this.IniciarEstado();
            }
        }

        private void almacenarCoordenadasParejasLista(Coordenadas coordenadas)
        {
            destapadas.Add(coordenadas);
        }

        private void ActivarBotones()
        {
            foreach (Button bot in arrayBotones)
            {
                bot.Enabled = true;
            }
        }

        private void TuTurno()
        {
            labelTuTurno.Show();
            labelSuTurno.Hide();
            buttonPowerUps.Show();
        }

        private void SuTurno()
        {
            labelTuTurno.Hide();
            labelSuTurno.Show();
            buttonPowerUps.Hide();
        }

        private void DesactivarBotones()
        {
            foreach (Button bot in arrayBotones)
            {
                bot.Enabled = false;
            }
        }

        private void button43_Click(object sender, EventArgs e)
        {
            tablero.PausarPartida(TiempoActual);
            this.Close();
        }

        private void FinalizarPartida(string json)
        {
            if (Controlador.Instance.PartidaActual.Nick_1.Equals(Controlador.Instance.UsuarioActual.Nick))
            {
                int puntuacionMia = Controlador.Instance.PartidaActual.Puntuacion_1.Value;
                int puntuacionSuya = Controlador.Instance.PartidaActual.Puntuacion_2.Value;
                int mayor = puntuacionMia > puntuacionSuya ? puntuacionMia : puntuacionSuya;
                int IDGana = puntuacionMia > puntuacionSuya ? Controlador.Instance.PartidaActual.Usuario_1 : Controlador.Instance.PartidaActual.Usuario_2;
                Controlador.Instance.UsuarioActual.FinalizarPartida(json, mayor, IDGana);
            }
            else if (Controlador.Instance.PartidaActual.Nick_2.Equals(Controlador.Instance.UsuarioActual.Nick))
            {
                int puntuacionMia = Controlador.Instance.PartidaActual.Puntuacion_2.Value;
                int puntuacionSuya = Controlador.Instance.PartidaActual.Puntuacion_1.Value;
                int mayor = puntuacionMia > puntuacionSuya ? puntuacionMia : puntuacionSuya;
                int IDGana = puntuacionMia > puntuacionSuya ? Controlador.Instance.PartidaActual.Usuario_2 : Controlador.Instance.PartidaActual.Usuario_1;
                Controlador.Instance.UsuarioActual.FinalizarPartida(json, mayor, IDGana);
            }
        }

        private string GuardarEstado(List<CasillaTablero> listaCasillasDestapadas = null)
        {
            if (Controlador.Instance.PartidaActual.Nick_1.Equals(Controlador.Instance.UsuarioActual.Nick))
            {
                List<CasillaTablero> listaCasillas = tablero.GuardarEstado();
                string json = AccesoTablero.PasarAJson(listaCasillas, Controlador.Instance.PartidaActual.Codigo, Controlador.Instance.PartidaActual.Puntuacion_1.Value, listaCasillasDestapadas);
                Controlador.Instance.UsuarioActual.EnviarMovimiento(json);
                return json;
            }
            else if (Controlador.Instance.PartidaActual.Nick_2.Equals(Controlador.Instance.UsuarioActual.Nick))
            {
                List<CasillaTablero> listaCasillas = tablero.GuardarEstado();
                string json = AccesoTablero.PasarAJson(listaCasillas, Controlador.Instance.PartidaActual.Codigo, Controlador.Instance.PartidaActual.Puntuacion_2.Value, listaCasillasDestapadas);
                Controlador.Instance.UsuarioActual.EnviarMovimiento(json);
                return json;
            } return "";
        }

        private string IniciarEstado(List<CasillaTablero> listaCasillasDestapadas = null)
        {
            if (Controlador.Instance.PartidaActual.Nick_1.Equals(Controlador.Instance.UsuarioActual.Nick))
            {
                List<CasillaTablero> listaCasillas = tablero.GuardarEstado();
                string json = AccesoTablero.PasarAJson(listaCasillas, Controlador.Instance.PartidaActual.Codigo, Controlador.Instance.PartidaActual.Puntuacion_1.Value, listaCasillasDestapadas);
                Controlador.Instance.UsuarioActual.GuardarEstado(json);
                return json;
            }
            else if (Controlador.Instance.PartidaActual.Nick_2.Equals(Controlador.Instance.UsuarioActual.Nick))
            {
                List<CasillaTablero> listaCasillas = tablero.GuardarEstado();
                string json = AccesoTablero.PasarAJson(listaCasillas, Controlador.Instance.PartidaActual.Codigo, Controlador.Instance.PartidaActual.Puntuacion_2.Value, listaCasillasDestapadas);
                Controlador.Instance.UsuarioActual.GuardarEstado(json);
                return json;
            } return "";
        }

        private void crearArrayBotones()
        {
            arrayBotones = new Button[,] {
            { button1, button8, button15, button22, button29, button36 },
            { button2, button9, button16, button23, button30, button37 },
            { button3, button10, button17, button24, button31, button38 },
            { button4, button11, button18, button25, button32, button39 },
            { button5, button12, button19, button26, button33, button40 },
            { button6, button13, button20, button27, button34, button41 },
            { button7, button14, button21, button28, button35, button42 }
            };
        }

        private void destaparCarta(object sender, EventArgs e)
        {
            tablero.destaparCarta(sender, e, timerCartas, timerInactividad, TiempoActual, this);
            TiempoInactivo = new TimeSpan();
            if (tablero.destapadas.Count == 0)
            {
                if (Controlador.Instance.PartidaActual.Nick_1.Equals(Controlador.Instance.UsuarioActual.Nick))
                {
                    labelPuntuacionYo.Text = "Puntuación: " + (Controlador.Instance.PartidaActual.Puntuacion_1 + tablero.CalcularPuntuacion());
                    Controlador.Instance.PartidaActual.Puntuacion_1 += tablero.CalcularPuntuacion();
                }

                else if (Controlador.Instance.PartidaActual.Nick_2.Equals(Controlador.Instance.UsuarioActual.Nick))
                {
                    labelPuntuacionYo.Text = "Puntuación: " + (Controlador.Instance.PartidaActual.Puntuacion_2 + tablero.CalcularPuntuacion());
                    Controlador.Instance.PartidaActual.Puntuacion_2 += tablero.CalcularPuntuacion();
                }
                if (tablero.EsFinPartida())
                {
                    string json = this.GuardarEstado();
                    this.FinalizarPartida(json);
                    this.Close();
                }
            }

            if (timerCronometro.Enabled == false) { timerCronometro.Start(); }
        }

        private void PartidaIndividual_Close(object sender, FormClosingEventArgs e)
        {
            //Codigo de cuando te rindes
            if (!CerradoPorCodigo)
            {
                if (tablero.EsMiTurno())
                {
                    var resultado = MessageBox.Show("Si cierras la ventana perderas tu turno, estás seguro?", "MemoryDuos",
                        MessageBoxButtons.OKCancel);
                    if (resultado == DialogResult.OK)
                    {
                        this.GuardarEstado();
                        e.Cancel = false;
                    }
                    else e.Cancel = true;
                }
            }
        }

        private void PartidaIndividual_Load(object sender, EventArgs e)
        {
            Image imag = Usuario.ObtenerImagenNick(Controlador.Instance.PartidaActual.Nick_1);
            Image image2 = Usuario.ObtenerImagenNick(Controlador.Instance.PartidaActual.Nick_2);
            labelNombreJugadorYo.Text = "Usuario: " + Controlador.Instance.UsuarioActual.Nick;
            if (Controlador.Instance.UsuarioActual.ImagenPerfil != null)
            {
                pictureBoxYo.Image = Controlador.Instance.UsuarioActual.ImagenPerfil;
            }
            if (!Controlador.Instance.PartidaActual.Nick_1.Equals(Controlador.Instance.UsuarioActual.Nick)) //Soy el 2
            {
                labelNombreContrincante.Text = "Contrincante: " + Controlador.Instance.PartidaActual.Nick_1;
                labelPuntuacionYo.Text += Controlador.Instance.PartidaActual.Puntuacion_2;
                labelPuntuacionRival.Text += Controlador.Instance.PartidaActual.Puntuacion_1;
                if (imag != null)
                {
                    pictureBoxRival.Image = imag;
                }
            }
            if (!Controlador.Instance.PartidaActual.Nick_2.Equals(Controlador.Instance.UsuarioActual.Nick)) //Soy el 1
            {
                labelNombreContrincante.Text = "Contrincante: " + Controlador.Instance.PartidaActual.Nick_2;
                labelPuntuacionYo.Text += Controlador.Instance.PartidaActual.Puntuacion_1;
                labelPuntuacionRival.Text += Controlador.Instance.PartidaActual.Puntuacion_2;
                if (image2 != null)
                {
                    pictureBoxRival.Image = image2;
                }
            }
            foreach (var buton in arrayBotones)
            {
                var coord = tablero.obtenerCoordenadaBoton(buton);
                if (tablero.GetEstado(coord) == false)
                {
                    buton.BackgroundImage = MemoryDuosInterfaz.Properties.Resources.MEMORYDUOS;
                }
                else buton.BackgroundImage = tablero.GetImagen(coord);
            }

            if (Controlador.Instance.PartidaActual.Turno.Equals(Controlador.Instance.UsuarioActual.ID)) { MostrarDestapadas(); } else { DesactivarBotones(); SuTurno(); }
        }

        private void MostrarDestapadas()
        {
            DesactivarBotones();
            if (tablero.destapadas.Count == 2)
            {
                foreach (var cas in tablero.destapadas)
                {
                    arrayBotones[cas.Y, cas.X].BackgroundImage = tablero.GetImagen(new Coordenadas(cas.Y, cas.X));
                    arrayBotones[cas.Y, cas.X].BackColor = Color.Green;
                }
                timerMostrarCartas.Start();
            }
            else
            {
                ActivarBotones(); TuTurno();
                buttonRefrescar.Enabled = true;
            }
        }

        private void taparCartas(Coordenadas c1, Coordenadas c2)
        {
            tablero.TaparCartas(c1, c2);
        }

        private void timerCartas_Tick(object sender, EventArgs e) //Cuando fallamos
        {
            //CerradoPorCodigo = true;
            List<CasillaTablero> destapadas = tablero.ObtenerListaDestapadas();
            tablero.TaparCartasDiferentes((Timer)sender);
            this.GuardarEstado(destapadas);
            SuTurno();
            DesactivarBotones();
            tablero.ActualizarEstadoPartida();
            // this.Close();
        }

        private void timerCronometro_Tick(object sender, EventArgs e)
        {
            if (!tablero.EsFinPartida())
            {
                TiempoActual = TiempoActual.Add(new TimeSpan(0, 0, 1));
                TiempoInactivo = TiempoInactivo.Add(new TimeSpan(0, 0, 1));
                labelTiempo.Text = TiempoActual.ToString().Substring(3);
                if (TiempoInactivo.Seconds == 20) { timerCronometro.Stop(); }
            }
            else timerCronometro.Stop();
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            Publi.cargarEnlaces();
        }

        private void pFoto_MouseEnter(object sender, EventArgs e)
        {
#if DEBUG
            foreach (var buton in arrayBotones) { buton.BackgroundImage = tablero.GetImagen(tablero.obtenerCoordenadaBoton(buton)); buton.Refresh(); }
#endif
        }

        private void pFoto_MouseLeave(object sender, EventArgs e)
        {
#if DEBUG
            foreach (var buton in arrayBotones)
            {
                var coord = tablero.obtenerCoordenadaBoton(buton);
                if (tablero.GetEstado(coord) == false)
                {
                    buton.BackgroundImage = MemoryDuosInterfaz.Properties.Resources.MEMORYDUOS;
                }
            }
#endif
        }

        private void PartidaIndividual_FormClosed(object sender, FormClosedEventArgs e)
        {
            //if (dal.HayPartidaSinFinalizar()) { dal.EliminarRanking(partida); }
            //var main = new Main();
            //main.Show();

            // Do something proper to CloseButton.
        }

        private void timerInactividad_Tick(object sender, EventArgs e)
        {
            tablero.TaparCarta(tablero.destapadas.ElementAt(0));
        }

        private void buttonRefrescar_Click(object sender, EventArgs e)
        {
            buttonRefrescar.Enabled = false;
            tablero.ActualizarEstadoPartida();
            if (tablero.EsMiTurno())
            {
                MostrarDestapadas();
            }
        }

        private void buttonAbandonar_Click(object sender, EventArgs e)
        {
            DialogResult resultado = MessageBox.Show("Estas seguro de que quieres abandonar esta partida?", "MemoryDuos", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (resultado.Equals(DialogResult.Yes))
            {
                var estado = Controlador.Instance.UsuarioActual.AbandonarPartida(Controlador.Instance.PartidaActual.Codigo);
                if (estado.Estado)
                {
                    CerradoPorCodigo = true;
                    this.Close();
                }
            }
        }

        private void timerMostrarCartas_Tick(object sender, EventArgs e)
        {
            ActivarBotones(); TuTurno(); buttonRefrescar.Enabled = true;
            if (tablero.destapadas.Count == 2)
            {
                tablero.TaparCartasDiferentes(timerCartas);
            }
            tablero.destapadas.Clear(); timerMostrarCartas.Stop();
        }

        public void destaparPareja()
        {
            if (tablero.EsMiTurno() && usado == false)
            {
                tablero.destaparPareja();
                tablero.destapadas.Clear();
                usado = true;
                ActualizarLabelPuntuacion();
            }
        }

        public void ActualizarLabelPuntuacion()
        {
            if (Controlador.Instance.PartidaActual.Nick_1.Equals(Controlador.Instance.UsuarioActual.Nick))
            {
                labelPuntuacionYo.Text = "Puntuación: " + (Controlador.Instance.PartidaActual.Puntuacion_1 + tablero.CalcularPuntuacion());
            }
            else
            {
                labelPuntuacionYo.Text = "Puntuación: " + (Controlador.Instance.PartidaActual.Puntuacion_2 + tablero.CalcularPuntuacion());
            }
        }

        public void littleHelp()
        {
            if (tablero.EsMiTurno() && tablero.destapadas.Count == 1 && usado == false)
            {
                tablero.destaparCartaIgual();
                tablero.destapadas.Clear();
                usado = true;
                ActualizarLabelPuntuacion();
            }
        }

        private void button43_Click_1(object sender, EventArgs e)
        {
            bool usuario1 = Controlador.Instance.UsuarioActual.Nick.Equals(Controlador.Instance.PartidaActual.Nick_1);
            bool usuario2 = Controlador.Instance.UsuarioActual.Nick.Equals(Controlador.Instance.PartidaActual.Nick_2);

            if (usuario1 && Controlador.Instance.PartidaActual.Powerup_1 == true)
            {
                MessageBox.Show("Ya ha utilizado un PowerUp en esta partida", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            else if (usuario2 && Controlador.Instance.PartidaActual.Powerup_2 == true)
            {
                MessageBox.Show("Ya ha utilizado un PowerUp en esta partida", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            else
            {
                timerCartas.Stop();
                timerInactividad.Stop();
                timerMostrarCartas.Stop();

                UsarPowerUp usar = new UsarPowerUp();
                usar.setPartida(this);
                usar.ShowDialog();
            }
        }
    }
}